#include "cuda_runtime.h"
#include "device_launch_parameters.h"

#include "..\Core\System.cu\cuPrintf.cu"
#include "..\Core\System.cu\cuFalloc.cu"
#include "..\Core\System\LinkedObjList.h"

#include <stdio.h>

using namespace System;
template class LinkedObjList<int>;

class Item : public LinkedObjListNode<Item>
{
public:
	int Value;

	__device__ Item* xtor(int value)
	{
		Value = value;
		return this;
	}
};

__global__ void testLinkedObjList(fallocHeap* heap)
{
	fallocInit(heap);
	fallocContext* ctx = fallocCreateCtx(heap);

	//
	LinkedObjList<Item> list; list.xtor(ctx);
	list.AddLast(falloc<Item>(ctx)->xtor(5));
	list.AddLast(falloc<Item>(ctx)->xtor(3));
	list.AddLast(falloc<Item>(ctx)->xtor(1));
	list.AddLast(falloc<Item>(ctx)->xtor(2));
	list.AddLast(falloc<Item>(ctx)->xtor(7));
	list.AddLast(falloc<Item>(ctx)->xtor(10));

	LinkedObjList<Item>::Enumerator e; list.GetEnumerator(e);
	while (e.MoveNext(&list))
		cuPrintf("%d\n", e.Current->Value);
	e.Dispose();

	//
	fallocDisposeCtx(ctx);
}

int main()
{
	cudaFallocHost fallocHost = cudaFallocInit(2048);
	cudaPrintfInit(256000);

	// test
	testLinkedObjList<<<1, 1>>>(fallocHost.heap);

	// free and exit
	cudaPrintfDisplay(stdout, true); cudaPrintfEnd();
	cudaFallocEnd(fallocHost);
	printf("\ndone.\n"); //char c; scanf_s("%c", &c);
    return 0;
}
